package com.zui.manager;

import java.io.Serializable;
import java.util.Collection;
import java.util.List;

import org.hibernate.criterion.DetachedCriteria;
import org.hibernate.criterion.Order;

import com.zui.util.Page;

/**
 * @TODO: entityManager extends sessionManager
 * @author Sam
 *
 * @param <T>
 * @param <ID>
 */
public interface EntityManager <T, ID extends Serializable> {

	public T saveEntity(T entity);
	
	public void updateEntity(T entity); 
	
	public void deleteEntity(T entity); 
	 
	public void deleteEntityById(ID id); 
	
	/**
	 * Update the delete tag of the entities to "Y".
	 * @param c Class
	 * @param ids An array of String id;
	 */
	public void deleteEngtityFlagByIds(Class<T> c, String[] ids);
	/**
	 * 返回true如果存在的话
	 */
	public boolean checkExistence(DetachedCriteria criteria);
	
	public T findById(ID id);
	
	public T findById(Class<T> c, ID id);

	public T loadById(ID id); 
	
	public T loadById(Class<T> c, ID id);
 
	public List<T> loadAll(); 
	
	public void saveOrUpdate(T entity);
	
	
	public List<T> findByHql (String queryString);

	public List<T> findByHql(String queryString, Object[] params);
	
	/**
	 * 
	 * 
	 * @param selectString select clause
	 * @param queryString from plus where clause
	 * @param params
	 * @param page
	 * @param orderList order clause
	 * @return PaginatedListImpl,包含分页信息的对象列表。对象为根对象。
	 */
	public List<T> findByHql(String selectString, String queryString, Object[] params, Page page, List<String> orderList);
	
	/**
	 * 使用命名的HQL语句更新数据
	 * @param queryName
	 * @param values
	 */
	public int updateByNamedQuery(String queryName,Object[] values);
	
	/** 
	* 使用带参数的命名HSQL语句查询数据 
	* 
	* @param queryName 
	* @param values 
	* @return 
	*/ 
	public List<T> findByNamedQuery(String queryName, Object[] values); 
	
	/** 
	* 通过合并的方式更新对象
	* 
	* @param entity 
	* void 
	*/ 
	public void merge(T entity); 
	
	public void saveOrUpdateAll(Collection<T> entities); 
	
	/** 
	* 使用指定的检索标准检索数据
	* 
	* @param criteria 
	* @return 
	*/ 
	public List<T> findByCriteria(DetachedCriteria criteria);
	
	
	/**
	 * 按属性查找唯一对象.
	 */
	public T findUniqueByProperty(String propertyName, Object value);
	public List<T> findByCriteria(DetachedCriteria criteria, Page page);
	
	/**
	 * 根据criteria和orderList进行分页查询。
	 * 
	 * 出于性能考虑排序信息请勿放在criteria里，由本方法负责。
	 * 
	 * @param criteria
	 *            查询条件
	 * @param page
	 *            分页信息
	 * @param orderList
	 *            定制化的排序列表
	 * @return 包含分页信息的对象列表。对象为根对象。
	 */
	public List<T> findByCriteria(DetachedCriteria criteria,Page page, List<Order> orderList);
	
	public List<T> createSQLQuery(String nativeSql);

	public List<T> finaByCriteria(DetachedCriteria dc, Page page);
	/**
	 * 根据criteria和orderList进行分页查询。
	 * 
	 * 出于性能考虑排序信息请勿放在criteria里，由本方法负责。
	 * 
	 * @param criteria
	 *            查询条件
	 * @param page
	 *            分页信息
	 * @param orderList
	 *            定制化的排序列表
	 * @return JQGridListImpl,包含分页信息的对象列表。对象为根对象。
	 */
	public List<T> findByCriteriaForJQGrid(DetachedCriteria criteria, Page page,
			List<Order> orderList);
	/**
	 * 根据criteria进行分页查询。
	 * 
	 * @param criteria
	 *            查询条件
	 * @param page
	 *            分页信息
	 * @return 对象为根对象。
	 */
	public List<T> findByCriteriaForJQGrid(DetachedCriteria criteria, Page page);

}
